package com.zhj.interview;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author zhj
 */
public class Test01 {
    public static void main(String[] arges) throws Exception{
        IA ia = (IA) createObject(IA.class.getName()+"$getHelloName=Abc");
        System.out.println(ia.getHelloName()); //方法名匹配的时候，输出“Abc”
        ia = (IA) createObject(IA.class.getName()+"$getTest=Bcd");
        System.out.println(ia.getHelloName()); //方法名不匹配的时候，输出null
    }


    /**
     * 请实现方法createObject，接口中"getHelloName()"方法名仅仅是个示例，不能写死判断
     * @param str
     * @return
     * @throws Exception
     */
    public static Object createObject(String str) throws Exception {
        try {
            // 通过全类名构建目标类
            Class<?> a = Class.forName(str.substring(0,str.indexOf("$")));
            /**
             * 创建代理对象 由于该目标类没有实现接口，所以参数二不能使用getInterfaces()获取所有实现接口，只能通过new Class[] {a}来创建代理对象
             * 参数一：类加载器
             * 参数二：所有接口构成的数组 class[]
             * 参数三：InvocationHandler() 调用处理 ---代理类调用方法回调该调用处理
             */
            return Proxy.newProxyInstance(a.getClassLoader(), new Class[] {a}, new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    // 执行方法触发，返回正确的返回值
                    if (method.getName().equals(str.substring(str.indexOf("$")+1,str.indexOf("=")))) {
                        // 改变方法返回
                        return str.substring(str.indexOf("=")+1);
                    }
                    // return method.invoke(a.newInstance(), args);  正常会在调用方法前后做操作，然后返回被代理对象的执行结果
                    return null;
                }
            });
        }catch (Exception e){
            throw new Exception("还没有实现的方法");
        }
    }
}
interface IA {
    String getHelloName();
}

